package com.example.handheld4_gsignal_app.utils;

import android.util.Log;
import java.nio.charset.StandardCharsets;

/**
 * 字符编码处理工具类
 */
public class EncodingUtils {
    private static final String TAG = "EncodingUtils";
    
    /**
     * 修复中文字符编码问题
     * @param text 原始文本
     * @return 修复后的文本
     */
    public static String fixChineseEncoding(String text) {
        if (text == null || text.isEmpty()) {
            return text;
        }
        
        try {
            // 检查是否包含乱码字符
            if (containsGarbledText(text)) {
                Log.d(TAG, "检测到乱码文本，尝试修复: " + text);
                
                // 尝试多种编码修复方式
                String fixed = tryFixEncoding(text);
                if (fixed != null && !fixed.equals(text)) {
                    Log.d(TAG, "编码修复成功: " + text + " -> " + fixed);
                    return fixed;
                }
            }
            
            return text;
        } catch (Exception e) {
            Log.e(TAG, "字符编码修复失败", e);
            return text;
        }
    }
    
    /**
     * 检查文本是否包含乱码
     */
    private static boolean containsGarbledText(String text) {
        // 检查是否包含常见的乱码字符
        return text.contains("?") || 
               text.contains("") || 
               text.matches(".*[\\u00C0-\\u00FF].*") ||
               text.matches(".*[\\u0100-\\u017F].*");
    }
    
    /**
     * 尝试修复编码
     */
    private static String tryFixEncoding(String text) {
        try {
            // 方法1: ISO-8859-1 到 UTF-8
            byte[] bytes = text.getBytes(StandardCharsets.ISO_8859_1);
            String result1 = new String(bytes, StandardCharsets.UTF_8);
            if (isValidChineseText(result1)) {
                return result1;
            }
            
            // 方法2: 直接使用UTF-8
            String result2 = new String(text.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
            if (isValidChineseText(result2)) {
                return result2;
            }
            
            // 方法3: 尝试GBK编码
            try {
                byte[] gbkBytes = text.getBytes("GBK");
                String result3 = new String(gbkBytes, StandardCharsets.UTF_8);
                if (isValidChineseText(result3)) {
                    return result3;
                }
            } catch (Exception e) {
                // 忽略GBK编码错误
            }
            
        } catch (Exception e) {
            Log.e(TAG, "编码修复尝试失败", e);
        }
        
        return null;
    }
    
    /**
     * 检查是否为有效的中文文本
     */
    private static boolean isValidChineseText(String text) {
        if (text == null || text.isEmpty()) {
            return false;
        }
        
        // 检查是否包含中文字符
        boolean hasChinese = text.matches(".*[\\u4e00-\\u9fa5].*");
        
        // 检查是否包含常见的运营商名称
        boolean hasOperatorName = text.contains("中国移动") || 
                                 text.contains("中国联通") || 
                                 text.contains("中国电信") ||
                                 text.contains("中国广电") ||
                                 text.contains("未知运营商");
        
        return hasChinese || hasOperatorName;
    }
    
    /**
     * 确保字符串使用UTF-8编码
     */
    public static String ensureUtf8(String text) {
        if (text == null) {
            return null;
        }
        
        try {
            // 将字符串转换为UTF-8字节数组，再转换回字符串
            byte[] utf8Bytes = text.getBytes(StandardCharsets.UTF_8);
            return new String(utf8Bytes, StandardCharsets.UTF_8);
        } catch (Exception e) {
            Log.e(TAG, "UTF-8编码确保失败", e);
            return text;
        }
    }
}